//斐波那契数 （通常用 F(n) 表示）形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始，后面的每一项数字都是前面两项数字的和。也就是： 
//
// 
//F(0) = 0，F(1) = 1
//F(n) = F(n - 1) + F(n - 2)，其中 n > 1
// 
//
// 给定 n ，请计算 F(n) 。 
//
// 答案需要取模 1e9+7(1000000007) ，如计算初始结果为：1000000008，请返回 1。 
//
// 
//
// 示例 1： 
//
// 
//输入：n = 2
//输出：1
//解释：F(2) = F(1) + F(0) = 1 + 0 = 1
// 
//
// 示例 2： 
//
// 
//输入：n = 3
//输出：2
//解释：F(3) = F(2) + F(1) = 1 + 1 = 2
// 
//
// 示例 3： 
//
// 
//输入：n = 4
//输出：3
//解释：F(4) = F(3) + F(2) = 2 + 1 = 3
// 
//
// 
//
// 提示： 
//
// 
// 0 <= n <= 100 
// 
//
// 
//
// Related Topics 记忆化搜索 数学 动态规划 👍 549 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-04-22 23:58:32
 * @description LCR 126.斐波那契数
 */
public class FeiBoNaQiShuLieLcof{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 FeiBoNaQiShuLieLcof fun=new FeiBoNaQiShuLieLcof();
	 	 Solution solution = fun.new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
	public int fib1(int n) {
		final int MOD = 1000000007;
		if (n < 2) {
			return n;
		}
		int p = 0, q = 0, r = 1;
		for (int i = 2; i <= n; ++i) {
			p = q;
			q = r;
			r = (p + q) % MOD;
		}
		return r;
	}
	static final int MOD = 1000000007;

	public int fib(int n) {
		if (n < 2) {
			return n;
		}
		int[][] q = {{1, 1}, {1, 0}};
		int[][] res = pow(q, n - 1);
		return res[0][0];
	}

	public int[][] pow(int[][] a, int n) {
		int[][] ret = {{1, 0}, {0, 1}};
		while (n > 0) {
			if ((n & 1) == 1) {
				ret = multiply(ret, a);
			}
			n >>= 1;
			a = multiply(a, a);
		}
		return ret;
	}

	public int[][] multiply(int[][] a, int[][] b) {
		int[][] c = new int[2][2];
		for (int i = 0; i < 2; i++) {
			for (int j = 0; j < 2; j++) {
				c[i][j] = (int) (((long) a[i][0] * b[0][j] + (long) a[i][1] * b[1][j]) % MOD);
			}
		}
		return c;
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
